#pragma once
#include <malloc.h>
#include <stddef.h>
#include <stdint.h>

/* 内存分配函数类型 */
typedef void *(*alloc_function)(size_t size);

/* 内存销毁函数类型 */
typedef void (*dealloc_function)(void *);

/* 哈希函数类型 */
typedef uint64_t (*hash_function)(void *value);

/* 比较函数类型 */
typedef int (*compare_function)(void *, void *);

/* foreach 回调类型*/
typedef int (*foreach_callback)(void *);

/* 哈希树节点数据结构 */
typedef struct hash_tree_node_s {
  /* 指向数据 */
  void *data;
  /* 子层的数据 */
  struct hash_tree_node_s *sub_nodes;
  /* 子层已存出的数据量 */
  uint8_t sub_size;
  /* 子层质数表索引 */
  uint8_t sub_zhishu_index;
} hash_tree_node_t;

/* 哈希树数据结构 */
typedef struct hash_table_tree_s {
  /* 头节点 */
  hash_tree_node_t *node;
  /* hash函数 */
  hash_function hash_func;
  /* 内存分配函数 */
  alloc_function alloc_func;
  /* 内存销毁函数 */
  dealloc_function dealloc_func;
  /* 比较函数 */
  compare_function comp_func;
    /* 当前大小 */
  size_t size;
  /* 表长度 */ 
  size_t hash_xishu;
} hash_table_tree_t;

/* 操作函数 */
hash_table_tree_t *create_hash_table_tree(alloc_function allocator,
                              dealloc_function deallocator,
                              hash_function hash_func,
                              compare_function comp_func,
                              uint64_t table_size);
void destroy_hash_table_tree(hash_table_tree_t *tree);
void *hash_table_tree_get(hash_table_tree_t *tree, void *data);
int hash_table_tree_set(hash_table_tree_t *tree, void *data, void **pre_value);
void *hash_table_tree_pop(hash_table_tree_t *tree, void *data);
void hash_table_tree_foreach(hash_table_tree_t *tree, foreach_callback cb);
